动态规划、分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法。但是三者的应用场景和性质却存在着极大的不同:
#1. 分治法
分治法的精髓:
分–将问题分解为规模更小的子问题;
治–将这些规模更小的子问题逐个击破;
合–将已解决的子问题合并,最终得出“母”问题的解;
很容易将分治法与动态规划相混淆,但两者却有着本质上的差异。分治法采用的是递归的思想来求解问题,两个分解的子问题独立求解,其之间无任何的重叠。而上一层问题只需要对两个子问题进行一定的合并即可得到答案。即s(t)= s(sub1)+s(sub2)
,而s(sub1)
和s(sub2)
之间无任何重叠。
##1.1 使用分治法求数组中的最大值
函数将数组a[1],……,a[r]分成两部分,分别求出每部分的最大元素(递归地),并返回较大的那一个作为整个数组的最大元素。
int a[];
...
int max(int l,int r) {
if (l==r) return a[l];//如果只有一个元素,就返回它
int m=(l+r)/2;
int u = max(l,m);
int v = max(m+1,r);
return (u>v) ? u : v;
}
2. 动态规划
该种方法较为复杂,但十分有用和高效,其核心性质是当前问题的答案s(t)并不能单独由s(t-1)求得,还有可能需要使用到